package cn.tedu.m2;

import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

import javax.annotation.PostConstruct;
/*
    工作模式解决两个问题：
    1.合理分发
    - 手动 ack
       spring封装的api,默认就是手动ack。
       spring会自动手动执行发送回执消息。
    - qos= 1
      yml添加预抓取 prefetch=1

    2，持久化
    - 队列持久化
        new Queue(队列名，true)
    - 消息数据持久化
        spring封装的API,默认把消息设置成持久消息。new MessagePostProcessor(),在发送消息之前，可调整消息的属性，设置为持久或非持久。
 */
@SpringBootApplication
public class Main {
    public static void main(String[] args) {
        SpringApplication.run(Main.class, args);
    }
    @Autowired
    private Producter p;

    /**
     * 注入生产者，调用生产者的send()方法发送消息。
     * 消费者是自动创建实例，自动注册成为消费者，自动启动开始接收消息,不需要手动调用.
     */
    @Bean
    public Queue taskQueue(){
        //把队列的参数封装在Queue实例
        //在自动配置类中，会连接服务器，使用这里的参数来创建队列。
        return new Queue("task_queue", true);
    }
    /**
     * spring执行流程：包扫描创建实例 ---> 依赖注入 ---> @PostConstruct ---> 继续执行后续流程
     */
    @PostConstruct
    public void test(){
        new Thread(()->{
            p.send();
        }).start();
    }
}
